package com.jingbo.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author jiangjingbo
 * @version V1.0
 * @Project java2203
 * @Package com.jingbo.servlet
 * @Description:
 * @Date 2022/5/27 12:07
 */
public class BeanServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取请求参数(标识符, 方法名)
        String method = req.getParameter("method");
        //2. 如果method没有获取到值, 我们就跳转到首页
        if (method==null){
            return ;
        }
        //3. 反射调用对应的业务逻辑方法
        //获取class类
        Class clazz = this.getClass();
        //4. 从类中获取方法对象
        //第一个参数是方法名称  第二个 第三个参数 是方法中的参数
        try {
            Method clazzMethod = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //5. 执行从类中获取到的方法对象, 接收方法执行结果
        //第一个参数是类类型    第二个第三个  是调用 login方法传实参
            Object invoke = clazzMethod.invoke(this, req, resp);
            System.out.println("=========invoke======"+invoke);
            String jump =(String) invoke;
            //6. 根据返回的结果进行判断, 判断返回值不为空
            if(jump!=null){
                //jump获取到后例如: "forward:http://localhost:8080/admin/admin.jsp"
                //startsWith方法判断是否是前缀
                if (jump.startsWith("forward:")){
                    //7. 判断执行后是请求转发处理
                    System.out.println("=====3jump======="+jump);
                    //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                    String substring = jump.substring(jump.indexOf(":")+1);
                    //执行请求转发
                    System.out.println("=====substring======="+substring);
                    req.getRequestDispatcher(substring).forward(req,resp);
                }else if (jump.startsWith("redirect:")){
                    //8. 判断执行后是重定向处理
                    System.out.println("=====2jump======="+jump);
                    //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                    //返回一个新的字符串 返回该字符串的子串 xxx吧把这之前的去掉
                    String substring = jump.substring(jump.indexOf(":")+1);
                    //执行重定向
                    resp.sendRedirect(substring);
                }else {
                    //9. 判断如果是其他类型的返回值, 那么通过流写回到浏览器页面
                    System.out.println("=====1jump======="+jump);
                    resp.getWriter().println(jump);
                }
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
